package health.lm.com.component_base.webview.agent;

import android.app.Activity;
import android.graphics.Bitmap;
import android.support.annotation.Nullable;
import android.view.ViewGroup;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.widget.LinearLayout;

import com.just.agentweb.AgentWeb;
import com.just.agentweb.DefaultWebClient;
import com.just.agentweb.WebChromeClient;
import com.just.agentweb.WebViewClient;

import java.util.HashMap;

import health.lm.com.component_base.R;
import health.lm.com.component_base.webview.sonic.SonicImpl;

/**
 * agent webview 帮助类
 */

public class AgentHelper {
    private static AgentHelper helper;
    private AgentWeb agentWeb;


    public static AgentHelper getInstance(){
        if(helper==null){
            helper = new AgentHelper();
        }
        return helper;
    }

    /** 初始化返回初始化的对象*/
    public AgentWeb getAgentWeb(Activity ctx, ViewGroup view, SonicImpl mSonicImpl, String url){
        agentWeb = AgentWeb.with(ctx)//
                .setAgentWebParent( view, -1, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT))//传入AgentWeb的父控件。
                .closeIndicator()
//                .useDefaultIndicator(-1, 0)//设置进度条颜色与高度，-1为默认值，高度为2，单位为dp。
//                .setAgentWebWebSettings(getSettings())//设置 IAgentWebSettings。
                .setWebViewClient(mWebViewClient)//WebViewClient ， 与 WebView 使用一致 ，但是请勿获取WebView调用setWebViewClient(xx)方法了,会覆盖AgentWeb DefaultWebClient,同时相应的中间件也会失效。
                .setWebChromeClient(mWebChromeClient) //WebChromeClient
                .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK) //严格模式 Android 4.2.2 以下会放弃注入对象 ，使用AgentWebView没影响。
                .setMainFrameErrorView(R.layout.agentweb_error_page, -1) //参数1是错误显示的布局，参数2点击刷新控件ID -1表示点击整个布局都刷新， AgentWeb 3.0.0 加入。
                .useMiddlewareWebClient(mSonicImpl.createSonicClientMiddleWare()) //设置WebViewClient中间件，支持多个WebViewClient。引用sonic框架
//                .useMiddlewareWebChrome(getMiddlewareWebChrome()) //设置WebChromeClient中间件  ，支持多个WebChromeClient，AgentWeb 3.0.0 加入。
//                .setDownloadListener(mDownloadListener) 4.0.0 删除该API//下载回调
//                .openParallelDownload()// 4.0.0删除该API 打开并行下载 , 默认串行下载。 请通过AgentWebDownloader#Extra实现并行下载
//                .setNotifyIcon(R.drawable.ic_file_download_black_24dp) 4.0.0删除该api //下载通知图标。4.0.0后的版本请通过AgentWebDownloader#Extra修改icon
                .setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.DISALLOW)//打开其他页面时，弹窗质询用户前往其他应用 AgentWeb 3.0.0 加入。
                .interceptUnkownUrl() //拦截找不到相关页面的Url AgentWeb 3.0.0 加入。
                .createAgentWeb()//创建AgentWeb。
                .ready()//设置 WebSettings。
                .go(url); //WebView载入该url地址的页面并显示。
        return agentWeb;
    }


    private ChromeClient chromeClient;
    private ViewClient viewClient;

    public void setChromeClient(ChromeClient chromeClient) {
        this.chromeClient = chromeClient;
    }

    public void setViewClient(ViewClient viewClient) {
        this.viewClient = viewClient;
    }

    public interface  ChromeClient{
        void onProgressChanged(WebView view, int newProgress);
        void onReceivedTitle(WebView view, String title);
    }

    public interface  ViewClient{
        void shouldOverrideUrlLoading(WebView webView, String url);
        void onPageStarted(WebView view, String url, Bitmap favicon);
        void onPageFinished(WebView view, String url);
    }

    private WebChromeClient mWebChromeClient = new WebChromeClient() {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            //  super.onProgressChanged(view, newProgress);
            chromeClient.onProgressChanged(view,newProgress);
        }

        @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
            chromeClient.onReceivedTitle(view,title);
        }
    };


    private WebViewClient mWebViewClient = new WebViewClient() {

        private HashMap<String, Long> timer = new HashMap<>();

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            return false;
        }

        @Nullable
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            return super.shouldInterceptRequest(view, request);
        }
        //
        @Override
        public boolean shouldOverrideUrlLoading(final WebView view, String url) {
            viewClient.shouldOverrideUrlLoading(view,url);
            //intent:// scheme的处理 如果返回false ， 则交给 DefaultWebClient 处理 ，
            // 默认会打开该Activity  ， 如果Activity不存在则跳到应用市场上去.  true 表示拦截
//            if (url.startsWith("intent://") ) {
//                return true;
//            }
            if( url.startsWith("http:") || url.startsWith("https:") ) {
                return false;
            }
			/*else if (isAlipay(view, mUrl))   //1.2.5开始不用调用该方法了 ，只要引入支付宝sdk即可 ， DefaultWebClient 默认会处理相应url调起支付宝
			    return true;*/
            return false;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            viewClient.onPageStarted(view,url,favicon);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            viewClient.onPageFinished(view,url);
            if (timer.get(url) != null) {
                long overTime = System.currentTimeMillis();
                Long startTime = timer.get(url);
            }

        }
		/*错误页回调该方法 ， 如果重写了该方法， 上面传入了布局将不会显示 ， 交由开发者实现，注意参数对齐。*/

	   /* public void onMainFrameError(AbsAgentWebUIController agentWebUIController, WebView view, int errorCode, String description, String failingUrl) {

            Log.i(TAG, "AgentWebFragment onMainFrameError");
            agentWebUIController.onMainFrameError(view,errorCode,description,failingUrl);

        }*/

        @Override
        public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
            super.onReceivedHttpError(view, request, errorResponse);
        }

        @Override
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
            super.onReceivedError(view, errorCode, description, failingUrl);
        }
    };
}
